#ifndef PLACE_DB_H
#define PLACE_DB_H

#include <string>
#include <vector>
#include "database.h"
#include "../models/place.h"
#include "../models/route.h"

// 地点数据库操作类
class PlaceDB {
private:
    Database& db;
    
public:
    // 构造函数
    PlaceDB(Database& database) : db(database) {}
    
    // 添加地点
    bool addPlace(const Place& place);
    
    // 获取所有地点
    std::vector<Place> getAllPlaces();
    
    // 按类型获取地点
    std::vector<Place> getPlacesByType(const std::string& type);
    
    // 获取单个地点
    Place getPlaceById(int id);
    
    // 搜索地点（按名称或描述）
    std::vector<Place> searchPlaces(const std::string& keyword);
    
    // 搜索地点并按热度排序
    std::vector<Place> searchPlacesByPopularity(const std::string& keyword);
    
    // 搜索地点并按评价排序
    std::vector<Place> searchPlacesByRating(const std::string& keyword);
    
    // 获取推荐地点（景点和学校）按热度排序
    std::vector<Place> getRecommendedPlacesByPopularity(int limit = 10);
    
    // 获取推荐地点（景点和学校）按评价排序
    std::vector<Place> getRecommendedPlacesByRating(int limit = 10);
    
    // 更新地点热度
    bool updatePlacePopularity(int placeId, double newPopularity);
    
    // 更新地点评价
    bool updatePlaceRating(int placeId, double newRating);
    
    // 更新地点信息
    bool updatePlace(const Place& place);
    
    // 删除地点
    bool deletePlace(int id);
    
    // 添加内部地点
    bool addInternalPlace(const InternalPlace& place);
    
    // 获取地点内部地点
    std::vector<InternalPlace> getInternalPlaces(int parentId);
    
    // 获取单个内部地点
    InternalPlace getInternalPlaceById(int id);
    
    // 更新内部地点
    bool updateInternalPlace(const InternalPlace& place);
    
    // 删除内部地点
    bool deleteInternalPlace(int id);
    
    // 添加道路
    bool addRoad(const Road& road);
    
    // 获取所有道路
    std::vector<Road> getAllRoads();
    
    // 获取两点间道路
    std::vector<Road> getRoadsBetweenPoints(double lat1, double lng1, double lat2, double lng2, double radius = 0.01);
    
    // 获取所有缺少轮廓数据的地点
    std::vector<Place> getAllPlacesWithoutOutline();
    
    // 更新地点轮廓数据
    bool updatePlaceOutline(int placeId, const std::string& outlineData);
    
    // 批量添加地点
    bool addPlacesBatch(const std::vector<Place>& places);
};

#endif // PLACE_DB_H 